package com.example.demo.controller;

import com.example.demo.common.ResultAjax;
import com.example.demo.common.SessionUtils;
import com.example.demo.model.Articleinfo;
import com.example.demo.model.Userinfo;
import com.example.demo.model.vo.UserinfoVo;
import com.example.demo.service.ArticleService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;


@RestController
@RequestMapping("/art")
public class ArticleController {

    @Autowired
    private ArticleService articleService;
    private static final int _DESC_LENGTH = 120;//文章简介长度
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;//将线程池注入（任务执行器）
    @Autowired
    private UserService userService;
    /*
     * 得到当前登录用户的文章列表
     * */
    @RequestMapping("/mylist")
    public ResultAjax myList(HttpServletRequest request){
        //1.得到当前登录用户
            Userinfo userinfo = SessionUtils.getUser(request);
            if(userinfo == null){
                return ResultAjax.fail(-1,"请先登录！");
            }
        //2.根据用户id查询此用户发表的所有文章
            List<Articleinfo> list = articleService.getListByUid(userinfo.getId());
            //处理list 将文章正文变成简介
        if(list != null && list.size()>0){
            //并发编程
            list.stream().parallel().forEach((art)->{ //parallel()返回并行状态的流     stream()返回这个集合中的顺序流
                if(art.getContent().length() > 120){
                    art.setContent(art.getContent().substring(0,_DESC_LENGTH));
                }
            });

        }
        //3.返回给前端
        return ResultAjax.succ(list);
    }

    /*
    * 删除文章
    * */
    @RequestMapping("/del")
    public ResultAjax del(Integer aid,HttpServletRequest request){
        //1.参数校验
        if(aid == null || aid < 0){
            return ResultAjax.fail(-1,"参数错误！");
        }
        //2.得到当前登录的用户
        Userinfo userinfo = SessionUtils.getUser(request);
        if(userinfo == null){
            return ResultAjax.fail(-1,"请先登录！");
        }
        //3.判断文章的归属人+删除操作 where id=aid and uid=uid
        int result = articleService.del(aid,userinfo.getId());
        //4.将结果返回给前端
        return ResultAjax.succ(result);
    }

    /*
    * 添加文章
    * */
    @RequestMapping("/add")
    public ResultAjax add(Articleinfo articleinfo,HttpServletRequest request){
        //1.校验参数
        if(articleinfo == null || !StringUtils.hasLength(articleinfo.getTitle()) ||
                !StringUtils.hasLength(articleinfo.getContent())){
            return ResultAjax.fail(-1,"非法数据");
        }
        //2.组装数据
        Userinfo userinfo = SessionUtils.getUser(request);
        if(userinfo == null){
            return ResultAjax.fail(-2,"请先登录！");
        }
        articleinfo.setUid(userinfo.getId());
        //3.将数据入库
        int result = articleService.add(articleinfo);
        //4.将结果返回给前端
        return ResultAjax.succ(result);
    }

    /*
    * 查询自己发表的文章
    * */
    @RequestMapping("/update_init")
    public ResultAjax updateInit(Integer aid,HttpServletRequest request){
        //1.参数校验
        if(aid == null || aid <= 0){
            return ResultAjax.fail(-1,"参数有误！");
        }
        //2.得到当前登录用户的id
        Userinfo userinfo = SessionUtils.getUser(request);
        if(userinfo == null){
            return ResultAjax.fail(-2,"请先登录!");
        }
        //3.查询文章并校验权限 where id =#{aid} and uid =#{uid}
        Articleinfo articleinfo = articleService.getArticleByIdAndUid(aid,userinfo.getId());
        //4.将结果返回给前端
        return ResultAjax.succ(articleinfo);
    }

    /*
    * 修改文章信息
    * */
    @RequestMapping("/update")
    public ResultAjax update(Articleinfo articleinfo,HttpServletRequest request){
        //1.参数校验
        if(articleinfo == null ||
                !StringUtils.hasLength(articleinfo.getTitle()) ||
                !StringUtils.hasLength(articleinfo.getContent()) ||
                articleinfo.getId()==0){
            return ResultAjax.fail(-1,"非法参数！");
        }
        //2.获取登录用户
        Userinfo userinfo = SessionUtils.getUser(request);
        if(userinfo == null){
            return ResultAjax.fail(-2,"请先登录！");
        }
        articleinfo.setUid(userinfo.getId());
        //3.修改文章，并校验归属人
        int result = articleService.update(articleinfo);
        //4.将结果返回给前端
        return ResultAjax.succ(result);
    }

    /*
    * 查询文章详情页
    * */
    @RequestMapping("/detail")
    public ResultAjax detail(Integer aid) throws ExecutionException, InterruptedException {
        //1.参数校验
        if(aid == null || aid < 0){
            return ResultAjax.fail(-1,"非法参数！");
        }
        //2.查询文章详情
        Articleinfo articleinfo = articleService.getDetail(aid);
        if(articleinfo == null || articleinfo.getId() <= 0){
            return ResultAjax.fail(-1,"非法参数！");
        }
        //3.根据uid查询用户的详情
        FutureTask<UserinfoVo> userTask = new FutureTask<>(()->{
            return userService.getUserById(articleinfo.getUid());
        });
        taskExecutor.submit(userTask);
        //4.根据uid查询用户发表的总文章数
        FutureTask<Integer> artCountTask = new FutureTask<>(()->{
            return articleService.getArtCountByUid(articleinfo.getUid());
        });
        taskExecutor.submit(artCountTask);
        //5、组装数据
        UserinfoVo userinfoVo = userTask.get();//等待任务（线程池）执行完成
        int artCount = artCountTask.get();//等待任务（线程池）执行完成
        userinfoVo.setArtCount(artCount);
        HashMap<String,Object> result = new HashMap<>();
        result.put("user",userinfoVo);
        result.put("art",articleinfo);
        //6、返回结果给前端
        return ResultAjax.succ(result);
    }
    /*
    * 设置阅读量
    * */
    @RequestMapping("/increment_rcount")
    public ResultAjax incrementRCount(Integer aid){
        //1.校验参数
        if (aid ==null || aid <= 0){
            return ResultAjax.fail(-1,"参数有误！");
        }
        //2.更改数据库 update articleinfo set rcount=rcount+1 where aid=#{aid}
        int result =articleService.incrementRCount(aid);
        //3.返回结果
        return ResultAjax.succ(result);
    }

    /*
    * 查询分页功能
    * */
    @RequestMapping("/getlistbypage")
    public ResultAjax getListByPage(Integer pindex,Integer psize) throws ExecutionException, InterruptedException {
        //1.参数矫正
        if(pindex == null || pindex < 1){
            pindex = 1;//参数矫正(页数)
        }
        if(psize == null || psize < 1){
            psize = 2;//参数矫正(每页展示的文章条数)
        }
        //2.并发进行文章列表和总页数的查询
            //2.1、查询分页列表数据
        int finalOffset = psize * (pindex - 1);//分页公式
        int finalPSize = psize;
        FutureTask<List<Articleinfo>> listTask = new FutureTask<>(()->{
            return articleService.getListByPage(finalPSize,finalOffset);
        });
            //2.2查询总分页数
        FutureTask<Integer> sizeTask = new FutureTask<>(()->{
            //得到总条数
            int totalCount = articleService.getCount();
            double sizeTemp = (totalCount*1.0)/(finalPSize*1.0);
            return (int)Math.ceil(sizeTemp);
        });
        taskExecutor.submit(listTask);
        taskExecutor.submit(sizeTask);
        //3.组装数据
        List<Articleinfo> list = listTask.get();
        int size = sizeTask.get();
        HashMap<String,Object> map = new HashMap<>();
        map.put("list",list);
        map.put("size",size);
        //4.将结果返回给前端
        return ResultAjax.succ(map);
    }

}
